package part3.c16_singleton;

/**
 *  单例模式的好处，以及其不可缺少的使用，无需再说明。
 *  但这里依然需要讲述其缺点：
 *  1）并没有定义摧毁单例职责的方法，或者即便定义了也会产生新的问题
 *      摧毁，比如定义了{@link #decommission()}
 *      （注意，在本例用静态内部类的写法，其实完全不适用这种写法，因为不是if null ,则new instance的写法）
 *
 *      新的问题：
 *      比如乙把get到的instance = null。这样会导致之后新的使用（比如丙）getInstance的时候，又创建一个instance，
 *      而甲依然持有一个旧的instance。所以此时会存在2个不同的instance。
 *
 *      所以这个解决职责并不能很好的定义（虽说我个人怀疑这种需求）
 *
 *  2）不能继承。从单例的类继承的子类，并不是单例类，一样要重新写静态方法和变量。
 *  3）效率问题（假如是if null写法）
 *  4）不够隐藏。用户使用这个类的时候，一定知道它是单例的，因为显式的只能调用getInstance方法而不能通过构造。
 *
 */
public class SingletonDemo {
    private SingletonDemo() {
    }
    //静态内部类只有当被调用的时候才开始首次被加载
    private static class InstanceHolder{
        private static SingletonDemo instance = new SingletonDemo();
    }
    public  static SingletonDemo getInstance(){
        return InstanceHolder.instance;
    }
    //解除单例职责
    public static void decommission(){
        InstanceHolder.instance = null;
    }

}
